gl renderer: Keep track of current program color value
authorTimm Bäder <mail@baedert.org>
Fri, 24 Nov 2017 12:18:45 +0000 (13:18 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 21 Dec 2017 18:12:31 +0000 (19:12 +0100)
gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h

index b0673bffabe7c99aaec631186b623fd47df3bfdc..7e4a048e2772185070f027fd3561b5e55fd8c59c 100644 (file)
@@ -646,12 +646,8 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
 
     case GSK_COLOR_NODE:
       {
-        RenderOp op;
-
         ops_set_program (builder, &self->color_program);
-        op.op = OP_CHANGE_COLOR;
-        op.color = *gsk_color_node_peek_color (node);
-        ops_add (builder, &op);
+        ops_set_color (builder, gsk_color_node_peek_color (node));
         ops_draw (builder, vertex_data);
       }
     break;
@@ -851,13 +847,8 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
           }
         else
           {
-            RenderOp op;
-
             ops_set_program (builder, &self->coloring_program);
-
-            op.op = OP_CHANGE_COLOR;
-            op.color = *gsk_text_node_peek_color (node);
-            ops_add (builder, &op);
+            ops_set_color (builder, gsk_text_node_peek_color (node));
           }
 
         /* We use one quad per character, unlike the other nodes which
index 93e7ad250c1891898d78407be540abe96c4bfe4d..2b60653425f7f95e3573ab15863e684bfba32ea5 100644 (file)
@@ -210,6 +210,24 @@ ops_set_opacity (RenderOpBuilder *builder,
   return prev_opacity;
 }
 
+void
+ops_set_color (RenderOpBuilder *builder,
+               const GdkRGBA   *color)
+{
+  RenderOp op;
+
+  g_assert (builder->current_program->color_location != 0);
+
+  if (gdk_rgba_equal (color, &builder->program_state[builder->current_program->index].color))
+    return;
+
+  builder->program_state[builder->current_program->index].color = *color;
+
+  op.op = OP_CHANGE_COLOR;
+  op.color = *color;
+  g_array_append_val (builder->render_ops, op);
+}
+
 void
 ops_draw (RenderOpBuilder     *builder,
           const GskQuadVertex  vertex_data[GL_N_VERTICES])
index 85a19ec64cafa87b9fab938dbce4f134d76a6ec4..c3958b9bc46322b1c915e645259dcaac2472a627 100644 (file)
@@ -116,6 +116,10 @@ typedef struct
     graphene_matrix_t projection;
     int source_texture;
     graphene_rect_t viewport;
+    /* Per-program state */
+    union {
+      GdkRGBA color;
+    };
   } program_state[GL_N_PROGRAMS];
 
   /* Current global state */
@@ -160,6 +164,8 @@ int               ops_set_render_target (RenderOpBuilder         *builder,
 
 float             ops_set_opacity        (RenderOpBuilder        *builder,
                                           float                   opacity);
+void              ops_set_color          (RenderOpBuilder        *builder,
+                                          const GdkRGBA          *color);
 
 void              ops_draw               (RenderOpBuilder        *builder,
                                           const GskQuadVertex     vertex_data[GL_N_VERTICES]);